#!/usr/bin/env python3
"""
htmlcxx MCP Server

面向 htmlcxx 命令行工具的 MCP server，提供 HTML 文件解析和相关命令行操作功能。

MCP tools 列表：
1. htmlcxx_parse_files - 解析 HTML 文件
   - 用途：使用 htmlcxx 解析一个或多个 HTML/CSS 文件
   - 参数：files - 要解析的文件路径列表
   - 返回：统一的命令执行结果 JSON

2. htmlcxx_show_help - 显示帮助信息
   - 用途：显示 htmlcxx 命令的帮助信息
   - 参数：无
   - 返回：统一的命令执行结果 JSON

3. htmlcxx_show_version - 显示版本信息
   - 用途：显示 htmlcxx 的版本信息
   - 参数：无
   - 返回：统一的命令执行结果 JSON

4. htmlcxx_validate_option - 验证命令行选项
   - 用途：验证指定的命令行选项是否有效
   - 参数：option - 要验证的命令行选项
   - 返回：统一的命令执行结果 JSON
"""

import subprocess
import shlex
from typing import List
from mcp.server.fastmcp import FastMCP, Context

mcp = FastMCP("htmlcxx MCP Server")


@mcp.tool()
def htmlcxx_parse_files(files: List[str]) -> dict:
    """
    使用 htmlcxx 解析一个或多个 HTML/CSS 文件
    
    参数:
        files: 要解析的文件路径列表
        
    返回:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 实际执行的命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 构建命令
        cmd = ["htmlcxx"] + files
        command_str = " ".join(shlex.quote(arg) for arg in cmd)
        
        # 执行命令
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": command_str,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Command execution failed: {str(e)}"
        }


@mcp.tool()
def htmlcxx_show_help() -> dict:
    """
    显示 htmlcxx 命令的帮助信息
    
    返回:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 实际执行的命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 构建命令
        cmd = ["htmlcxx", "-h"]
        command_str = " ".join(shlex.quote(arg) for arg in cmd)
        
        # 执行命令
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": command_str,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Command execution failed: {str(e)}"
        }


@mcp.tool()
def htmlcxx_show_version() -> dict:
    """
    显示 htmlcxx 的版本信息
    
    返回:
        {
            "success": bool,      # 命令是否成功执行
            "command": str,       # 实际执行的命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 构建命令
        cmd = ["htmlcxx", "-V"]
        command_str = " ".join(shlex.quote(arg) for arg in cmd)
        
        # 执行命令
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": command_str,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Command execution failed: {str(e)}"
        }


@mcp.tool()
def htmlcxx_validate_option(option: str) -> dict:
    """
    验证指定的命令行选项是否有效
    
    参数:
        option: 要验证的命令行选项（如 "-x"）
        
    返回:
        {
            "success": bool,      # 命令是否成功执行（对于无效选项，返回 False 是预期的）
            "command": str,       # 实际执行的命令
            "exit_code": int,     # 命令退出码
            "stdout": str,        # 标准输出内容
            "stderr": str         # 标准错误内容
        }
    """
    try:
        # 构建命令
        cmd = ["htmlcxx", option]
        command_str = " ".join(shlex.quote(arg) for arg in cmd)
        
        # 执行命令
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        return {
            "success": result.returncode == 0,
            "command": command_str,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command_str,
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Command execution failed: {str(e)}"
        }


if __name__ == "__main__":
    mcp.run()